﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;

namespace AlgoHero.ModeloAlt
{

    public class MapeoDeTeclas
    {
        
 

//        private IDictionary<Type, IList<Tecla>> mapeo;
//        private void mdsadas()
//        {
//            Dictionary<Type,IList<Tecla>> mmm = new Dictionary<Type, IList<Tecla>>();
//            mmm[typeof(Do)] = new List<Tecla>();
//        }
//       
//
//        public MapeoDeTeclas()
//        {           
//            /* Crea una mapeo de teclas con todas las notas musicales válidas, y sin teclas asociadas.
//             */
//            this.mapeo = new Dictionary<Type, IList<Tecla>>();
//
//            foreach (string nombre in NombresDeNotas)
//            {
//                this.mapeo.Add(nombre, new List<Key>());
//            }
//        }
//
//        public void AddTeclasPara(string nombreDeNota, IList<Key> teclas)
//        {
//            /* Agrega al mapeo las teclas asociadas a la nota cuyo nombre es 'nombreDeNota'.
//             * 
//             * Precondiciones: nombreDeNota deber ser un nombre de nota musical válido.
//             * 
//             * Postcondiciones: Si nombreDeNota es inválido, lanza NotaInvalidaException.
//             */
//                        
//            string nombreEnLimpio = ValidarNombre(nombreDeNota);                        
//
            //Obtenemos la lista de teclas asociada a la nota
//            IList<Key> listaTeclas = this.mapeo[nombreEnLimpio];            
//                        
            //Agregamos las teclas que correspondan
//            foreach (Key tecla in teclas)
//            {
                // Si alguna de las teclas ya se encontraba en el mapeo, no la agrega nuevamente
//                if (!listaTeclas.Contains(tecla))
//                {
//                    listaTeclas.Add(tecla);
//                }
//            }      
//        }
//
//        private string ValidarNombre(string unNombreDeNota)
//        {
//            /* Verifica si el nombre de la nota es válido. Si lo es, devuelve el nombre sin espacios en blanco de mas y
//             * en mayusculas. Si no lo es, lanza NotaInvalidaException.
//             */
// 
//            string nombreEnLimpio = unNombreDeNota.Trim().ToUpper();
//
//            if (!NombresDeNotas.Contains(nombreEnLimpio))
//            {
//                throw new NotaInvalidaException("El nombre de la nota es invalido.");
//            }
//
//            return nombreEnLimpio;
//        }
//
//        public IList<Key> GetTeclasPara(string nombreDeNota)
//        {
//            /* Devuelve las teclas asociadas a la nota cuyo nombre es 'nombreDeNota'.
//             * 
//             * Precondiciones: nombreDeNota deber ser un nombre de nota musical válido.
//             * 
//             * Postcondiciones: Si nombreDeNota es inválido, lanza NotaInvalidaException.
//             */
//
//            string nombreEnLimpio = ValidarNombre(nombreDeNota);                        
//
//            return (this.mapeo[nombreEnLimpio]);
//        }
//
//        public void EliminarTeclasPara(string nombreDeNota, IList<Key> teclas)
//        {
//            /* Elimina del mapeo las teclas asociadas a la nota 'nombreDeNota' que sean iguales
//             * a las teclas contenidas en 'teclas'.
//             * 
//             * Precondiciones: nombreDeNota deber ser un nombre de nota musical válido.
//             * 
//             * Postcondiciones: Si nombreDeNota es inválido, lanza NotaInvalidaException.
//             */
//
//            string nombreEnLimpio = ValidarNombre(nombreDeNota);                        
//
//            IList<Key> listaTeclas = this.mapeo[nombreEnLimpio];
//
//            foreach(Key tecla in teclas)
//            {
                // si 'tecla' no está asociada a la nota, no hace nada
//                if (listaTeclas.Contains(tecla))
//                {
//                    listaTeclas.Remove(tecla);
//                }
//            }                
//        }
//
//        public void EliminarTeclasPara(string nombreDeNota)
//        {
//            /* Elimina del mapeo todas las teclas asociadas a la nota 'nombreDeNota'.
//             * 
//             * Precondiciones: nombreDeNota deber ser un nombre de nota musical válido.
//             * 
//             * Postcondiciones: Si nombreDeNota es inválido, lanza NotaInvalidaException.
//             */
//
//            string nombreEnLimpio = ValidarNombre(nombreDeNota);
//
//            this.mapeo[nombreEnLimpio].Clear();
//        }
//
//        public bool TieneTeclas()
//        {
//            /* Devuelve true si ninguna nota en el mapeo tiene teclas asociadas.
//             * Devuelve false si alguna nota en el mapeo tiene alguna tecla asociada.
//             */
//
//            foreach (IList<Key> teclas in this.mapeo.Values)
//            {
//                if (teclas.Count != 0)
//                {
//                    return false;
//                }
//            }
//
//            return true;
//        }
                


    }
}
